﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//指针 -- 地址
//指针变量 -- 存放地址的变量

int main()
{
//指针变量和地址
	//int a = 10;
	////&a -- & --> 取地址操作符
	////& 单目操作符
	//printf("%p\n", &a);
	//int * pa = &a; //p是一个变量(指针变量)，是一块空间
	//编号 == 地址 == 指针

	//首先说明：a的类型为 int 类型，而p的类型为 int * 类型
	//如何理解p的类型：可把 int * 拆成两部分，(1) * 在说明p是指针变量 (2) int 说明p指向的对象是 int 类型的 --> 整体为p的类型

	//char ch = 'w';
	//char * pc = &ch;

//解引用操作符
	//int a = 10;
	//int* p = &a;
	//*p = 0; // * - 解引用操作符(间接访问操作符)
	//printf("%d\n", a); //a = 0
	////到此可以把 & 和 * 当作一对，两者相互抵消
	////*&a = 0; // == a = 0;

//指针变量的大小
	//地址怎么产生? --> 地址线上传输的
	//32根地址线 --> 地址就是：32个0/1组成的二进制序列
	//要存储这样的地址 --> 需要32bit位的空间 -- 4个字节
	//同理64位机器，假设有64根地址线，⼀个地址就是64个二进制位组成的⼆进制序列，
	// 存储起来就需要8个字节的空间，指针变量的大小就是8个字节。

	/*printf("%zd\n", sizeof(char*));
	printf("%zd\n", sizeof(int*));
	printf("%zd\n", sizeof(float*));
	printf("%zd\n", sizeof(double*));
	printf("%zd\n", sizeof(short*));
	printf("%zd\n", sizeof(long*));*/
	//若环境为x64，即64位环境，则指针变量的大小为8个字节
	//若环境为x86，即32位环境，则指针变量的大小为4个字节
	//总结：指针变量的大小和类型是无关的，只要指针类型的变量，在相同的平台下，大小都是相同的。

//指针变量类型的意义
//指针的解引用
	////代码1：
	//int a = 0x11223344;
	//int* pa = &a;
	//*pa = 0;

	////代码2:
	//int a = 0x11223344;
	//char* pa = (char*)&a;
	//*pa = 0;
	//上面两个代码在调试我们可以看到：代码1会将a的4个字节全部改为0，但是代码2只是将a的第一个字节改为0。
	//指针变量类型的意义：决定了对指针解引用的时候有多大的权限（⼀次能操作几个字节）。
	//比如： char * 的指针解引用就只能访问⼀个字节，⽽ int* 的指针的解引用就能访问四个字节。

//指针 +/- 整数
	/*int n = 10;
	int* pa = &n;
	char* pc = &n;
	printf("&n     = %p\n", &n);
	printf("pa     = %p\n", pa); 
	printf("pa + 1 = %p\n", pa + 1); 
	printf("pc     = %p\n", pc); 
	printf("pc + 1 = %p\n", pc + 1); 
	printf("pc + 4 = %p\n", pc + 4);*/
	//其中一次代码运行的结果：
	//&n     = 00DBFE14
	//pa     = 00DBFE14
	//pa + 1 = 00DBFE18
	//pc     = 00DBFE14
	//pc + 1 = 00DBFE15
	//pc + 4 = 00DBFE18
	//我们可以看出， char* 类型的指针变量 +1 跳过1个字节， int* 类型的指针变量 +1 跳过了4个字节。
	// 这就是指针变量的类型差异带来的变化。
	//指针变量类型的意义：指针的类型决定了指针向前或者向后走⼀步有多大（距离）。
	return 0;
}